#include <fentl.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <sharc.h>
#include <io.h> требуется только для объявления функции
int sopen(pathname,oflag,shflag{,pmode]);
char *pathname; path-имя файла
int oflag; тип разрешенных операций
int shflag; разрешенный тип разделения
int pmode; разрешенный тип доступа
Описание.
Функция sopen открывает файл, заданный по path -имени, и подготавливает его к последующему разделенному чтению или записи, что определяется значением oflag или shflag . Oflag является целым выражением, состоящим из комбинации одной или нескольких следующих манифестных констант, объявленных в <fcntl.h> . Когда задана более чем одна манифестная константа, тогда они объединяются при помощи оператора ИЛИ(:).
OFLAG ЗНАЧЕНИЕ
O_APPEND Перед каждой операцией записи
перемещает указатеь на файл в конец
файла.
O_CREAT Новый файл создан и открыт для записи;
это не эффективно, если существует
файл, определяемый по path-имени.
O_EXCL Возвращается значение ошибки, если
существует файл, определяемый по path-
имени. Используется вместе с O_CREATE.
O_RDONLY Файл открыт только для чтения, если
задан этот флаг, также может быть вы-
бран флаг O_RDWR или O_WRONLY.
O_RDWR Файл открыт одновременно для чтения и
записи; если задается этот флаг, то
может быть выбран флаг O_RDONLY или
O_WRONLY.
O_TRUNC Существующий файл открыт и усечен к
длине 0; этот файл должен иметь разре-
шение на запись. Содержимое файла
уничтожается.
O_WRONLY Файл открыт только для чтения; если
задан этот флаг, должен быть задан
флаг O_RDONLY или O_RDWR.
O_BINARY Файл открыт в двоичном (не транслиро-
ванном) режиме. (См. описание двоич-
ного режима у функции fopen).
O_TEXT Файл открыт в текстовом (транслирован-
ном) режиме. (См. описание тексто-
вого режима у функции fopen).
Замечание:
O_TRUNC полностью уничтожает содержимое существующего файла, поэтому нужно внимательно использовать эту константу.
Аргумент shflag является константным выражением, состоящим из следующих манифестных констант, объявленных в <share.h> . Подробно информация о режиме разделения приведена в руководстве по MS DOS.
shflag Значение
SH_COMPAT устанавливается режим совместимости
SH_DENYRW доступ по чтению и записи в файле не
разрешен
SH_DENYWR доступ по записи в файле не разрешен
SH_DENYRD доступ по чтению в файле не разрешен
SH_DENYNO доступ по чтению и записи разрешен
Аргумент pmode требуется только тогда, когда определена константа 0_CREAT . Если файл не существует, pmode также определяет типы доступа для файла, которые устанавливаются во время первого закрытия нового файла. В противном случае аргумент pmode игнорируется. Аргумент pmode является целым выражением, содержащим одну или больше манифестных констант S_IWRITE и S_IREAD , объявленных в <sys\stat.h> . Когда задаются обе константы, они объединяются оператором ИЛИ(!). Значение аргумента pmode приведено ниже.
КОНСТАНТА ЕЕ СМЫСЛОВОЕ ЗНАЧЕНИЕ
S_IWRITE разрешает запись
S_IREAD разрешает чтение
S_IREAD:S_IWRITE разрешают чтение и запись
Если запись не разрешена, файл предназначен только для чтения. В MS DOS все файлы открыты для чтения, разрешение по записи не задается. Поэтому модели S_IWRITE и S_IREAD : S_IWRITE являются эквивалентными.
Перед установкой разрешения функция sopen прикладывает текущую маску файла к pmode (см. umask ).
Возвращаемое значение.
Функция sopen возвращает handle -р на открытый файл. Возвращаемое значение -1 указывает на ошибку; errno устанавливается в одно из следующих значений:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
EACCES Заданное path-имя является директорием
или сделана попытка записать в файл,
открытый только для чтения, или
возникло нарушение в режиме разделения.
(Версии MS DOS 3.0 и старше).
EINVAL Командный файл SHARE.COM не инстоллиро-
ван.
EEXIST Флаги O_CREAT и O_EXCL определены, но
названный файл всегда существует.
EMFILE Другие handle-ры файла не доступны,
т.к. много открытых файлов.
ENOENT Файл или path-имя не найдено.
Замечание:
Функция sopen используется в версиях 3.0 MS DOS и старших. В ранних версиях MS DOS аргумент shflag игнорируется.
Режимы разделения файлов работают неверно с буферизованными файлами, поэтому fdopen не используется для связи потока и файла, открытого к разделению или закрытию.
Пример:
#include <fcntl.h>
#include<sys\types.h>
#include<sys\stat.h>
#include<share.h>
#include<io.h>
extern unsigned char _osmajor;
int fh;
/* Перед вызовом sopen используется переменная _osmajor для
проверки номера версии MS DOS . */.
if (_osmajor >=3)
fh = sopen ("data", O_RDWR:O_BINARY, SH_DENYRW);
else
fh = open ("data", O_RDWR: O_BINARY);